package design;

/**
 * CompletionService
TODO *任务产生线程                                                                                               结果处理线程
 *           Submit Task（提交任务）                    Store Result(存储结果)                      拉取Result
 ** Completion---------------------->Executor(线程池处理)--------------------->BlockedQueue(阻塞队列)---------->获取并处理结果
 */

import design.masterWorker.Result;
import design.masterWorker.SalaryRunner;

import java.util.concurrent.*;

/** CompletionService的使用模式
 * 你可用它不断的提交任务（线程）给Executor处理
 * 处理后的记过都会自动放入BlockedQueue
 * 另外一个线程不断的从队列里获取处理结果
 * 那个任务先处理完就能先得到那个结果
 * 组后做汇总处理
 * 从而轻松万册灰姑娘MasterWorker模式相同的功能
 */
public class MasterWorkTest3 {
    // CompletionService
    // submit 用于提交任务
    // take用于获取处理结果（阻塞式）
    // poll也用于获取处理结果（非阻塞式）
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        // 创建线程池
        ExecutorService executor = Executors.newCachedThreadPool();
        // 创建CompletionService,需要借 助Executor来实现
        CompletionService cs = new ExecutorCompletionService(executor);
        // 创建回调线程
        Result result = new Result();
        SalaryRunner r1 = new SalaryRunner(result,200,2000);
        SalaryRunner r2 = new SalaryRunner(result,100,1000);

        Future<Result> f1 = cs.submit(r1,result);
        Future<Result> f2 = cs.submit(r2,result);
        System.out.println("f1:"+f1.get().getValue());
        System.out.println("f2:"+f2.get().getValue());
    }
}
